Real Man ์ฑ„ํŒ…๊ด€๋ จ ์ฝ”๋“œ ์ •๋ฆฌ

1/15/2025

๋ฐฑ์—”๋“œ

ChatController (์ปจํŠธ๋กค๋Ÿฌ)

๋™๊ธฐ ์ฒ˜๋ฆฌ(ํŽ˜์ด์ง€ ์ด๋™)

chatting()

์‚ฌ์šฉ์ž๊ฐ€ ์ฑ„ํŒ…๋ฐฉ ์ ‘์†ํ• ๋•Œ ํ˜ธ์ถœ.

  • ๊ฒฝ๋กœ:ย GET /chat/main/{serverNo}/{channelNo}
  • ๊ณผ์ • :
    1. ๋กœ๊ทธ์ธ ํšŒ์› ์ •๋ณด ํ™•์ธ
    2. model์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ
      • ์„œ๋ฒ„ ๋ชฉ๋ก / ์ฑ„๋„ ๋ชฉ๋ก/ ์„œ๋ฒ„ ๋ฉค๋ฒ„ ๋ชฉ๋ก/ ์„œ๋ฒ„ ์ด๋ฆ„ / ๊ด€๋ฆฌ์ž ์—ฌ๋ถ€ / ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€๋“ค / ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
    3. ์ฑ„๋„ ํƒ€์ž…์— ๋งž๋Š” ํŽ˜์ด์ง€๋กœ ์ด๋™(๋ทฐ ๋ฐ˜ํ™˜)

selectSmallestChatNo()

๋น„๋™๊ธฐ ๋ฐฉ์‹์ด์ง€๋งŒ ํŽ˜์ด์ง€ ์ด๋™์— ์‚ฌ์šฉ๋จ.
์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ์ฑ„๋„์„ ํด๋ฆญํ•˜์ง€ ์•Š๊ณ  ์„œ๋ฒ„๋ฅผ ํด๋ฆญํ–ˆ์„๋•Œ ํ˜ธ์ถœ.

  • ๊ฒฝ๋กœ:ย POST /chat/selectSmallestChatNo
  • ๊ณผ์ •:
    1. ํด๋ผ์ด์–ธํŠธ์—์„œ ์ „์†กํ•œ ์„œ๋ฒ„๋„˜๋ฒ„์—์„œ ๊ฐ€์žฅ ์ž‘์€ ์ฑ„๋„๋„˜๋ฒ„๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.sService.selectChannelNo(serverNo)
    2. ๋ฐ˜ํ™˜.
      ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฐ˜ํ™˜๋ฐ›์€ ์ฑ„๋„๋„˜๋ฒ„๋กœ ๋‹ค์‹œ ์œ„์˜ Chatting()์œผ๋กœ ์žฌ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™.

์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ์ „์†ก

sendMessage()

์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ DB์ €์žฅ, WebSocket ๋ฐœํ–‰

  • ๊ฒฝ๋กœ:ย @MessageMapping("/chat/{channelNo}/{separetor}")
    • ํด๋ผ์ด์–ธํŠธ์ชฝ์—์„œ๋Š” pub/chat/{}/{} ์ฃผ์†Œ๋กœ ์ „์†ก.
  • ๊ณผ์ •:
    1. ์„ธ์…˜์—์„œ ๋กœ๊ทธ์ธ ๋ฉค๋ฒ„ ์ •๋ณด ์กฐํšŒ
    2. ๋ฉ”์‹œ์ง€ ๊ฐ์ฒด์— ๋‹ค์Œ์˜ ์ •๋ณด ์ €์žฅ
      • ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์‚ฌ์ง„, ์ฑ„๋„๋„˜๋ฒ„, ๊ตฌ๋ถ„์ž(separator : ๋ฌธ์ž์ฑ„ํŒ… or ํ™”์ƒ์ฑ„ํŒ…)
    3. Firebase์— ๋ฉ”์‹œ์ง€ ์ €์žฅ cService.insertChat(message)
    4. WebSocket ๋ฐœํ–‰ messagingTemplate.convertAndSend(์ฃผ์ œ(๊ฒฝ๋กœ), ๋ฉ”์‹œ์ง€)

Voice ์ฑ„ํŒ… ๊ด€๋ จ

joinVoiceChannel()

์Œ์„ฑ ์ฑ„ํŒ…๋ฐฉ ์ž…์žฅ ์ฒ˜๋ฆฌ

  • ๊ฒฝ๋กœ:ย @MessageMapping("/chat/joinVoice")
    • ํด๋ผ์ด์–ธํŠธ ์ชฝ์—์„œ๋Š” pub/chat/joinVoice์ฃผ์†Œ๋กœ ์ „์†ก
  • ๊ณผ์ •: ์‚ฌ์šฉ์ž๋ฅผ ์Œ์„ฑ ์ฑ„๋„ ๋งต์— ์ถ”๊ฐ€ํ•˜๊ณ  ์ „์ฒด ๋ชฉ๋ก ๋ฐ˜ํ™˜.

joinVoiceChannel() (์œ„์˜ ๋ฉ”์†Œ๋“œ์™€ ๋‹ค๋ฆ„)

ํ˜„์žฌ ์Œ์„ฑ ์ฑ„ํŒ… ์‚ฌ์šฉ์ž ๋ชฉ๋ก ์กฐํšŒ

  • ๊ฒฝ๋กœ :ย GET /chat/api/voiceUsers
  • ๊ณผ์ • : userInChannel(์ฑ„๋„ ์ฐธ๊ฐ€์ž ๋งต)๊ฐ์ฒด ๋‹จ์ˆœ ๋ฐ˜ํ™˜.

leaveVoiceChannel()

์Œ์„ฑ ์ฑ„ํŒ…๋ฐฉ ํ‡ด์žฅ ์ฒ˜๋ฆฌ

  • ๊ฒฝ๋กœ:ย @MessageMapping("/chat/leaveVoice")
  • ๊ณผ์ •: ์‚ฌ์šฉ์ž๋ฅผ userInChannel(์ฑ„๋„ ์ฐธ๊ฐ€์ž ๋งต)์—์„œ ์ œ๊ฑฐ.

WebRTC ๊ด€๋ จ ๋ฉ”์†Œ๋“œ๋“ค (์˜์ƒ ํ†ตํ™”)

PeerHandleOffer()

(์‚ฌ์šฉ ์•ˆ๋จ)
WebRTC Offer ์ •๋ณด ์ค‘๊ณ„

  • ๊ฒฝ๋กœ:ย @MessageMapping("/peer/offer/{camKey}/{roomId}")

PeerHandleIceCandidate()

ICE Candidate ์ •๋ณด ์ค‘๊ณ„ ๋ฐ ๋น„๋””์˜ค ์ฐธ๊ฐ€์ž ๊ด€๋ฆฌ

  • ๊ฒฝ๋กœ :ย @MessageMapping("/peer/iceCandidate/{camKey}/{roomId}")
  • ๊ณผ์ • :
    1. videoInChannel(์ฑ„๋„ ์ฐธ๊ฐ€์ž ๋งต) ์—์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ „์†กํ•œ camKey๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์ด๋ฏธ ์žˆ์œผ๋ฉด ์ œ๊ฑฐ. (์ค‘๋ณต ์ฐธ๊ฐ€ ๋ฐฉ์ง€)
    2. videoInChannel.computeIfAbsent()๋กœ ์‚ฌ์šฉ์ž๋ฅผ ๋งต์— ์‚ฝ์ž…ํ•œ๋‹ค. (computeIfAbsent()๋ฉ”์†Œ๋“œ๋Š” ์Šค๋ ˆ๋“œ ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋œ๋‹ค.)

PeerHandleAnswer()

(์‚ฌ์šฉ ์•ˆ๋จ)
WebRTC Answer ์ •๋ณด ์ค‘๊ณ„

  • ๊ฒฝ๋กœ:ย @MessageMapping("/peer/answer/{camKey}/{roomId}")

callKey(),ย sendKey()

์˜์ƒํ†ตํ™”์šฉ ํ‚ค ๊ตํ™˜

  • ๊ฒฝ๋กœ:ย @MessageMapping("/call/key"),ย @MessageMapping("/send/key")

ICE ํ›„๋ณด?

ICE Candidate๋Š” WebRTC๋ฅผ ์‚ฌ์šฉํ•ด ํ™”์ƒํ†ตํ™”๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ ํ•„์š”ํ•œ ์ •๋ณด๋“ค์ด๋‹ค.
๊ฐ ํด๋ผ์ด์–ธํŠธ์—์„œ ํ™”์ƒํ†ตํ™”์— ํ•„์š”ํ•œ ์—ฌ๋Ÿฌ ์ •๋ณด๋“ค์„ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋ฉด ์„œ๋ฒ„์—์„œ ์ค‘๊ณ„ ๋กœ์ง์— ๋”ฐ๋ผ ์ตœ์ ์˜ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ฐ ํด๋ผ์ด์–ธํŠธ์— ์•Œ๋ ค์ค€๋‹ค.
(ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—๋Š” ๋กœ์ง์ด ๊ตฌํ˜„๋˜์ง€ ์•Š๊ณ , ๋‹จ์ˆœํžˆ ๊ฐ ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌ๋งŒ)

ํ‚ค?

Key๋Š” ์ ‘์†๋œ ์‚ฌ์šฉ์ž๋“ค์˜ ์‹๋ณ„์ž(์ด๋ฆ„) ์—ญํ• .
์ฐธ๊ฐ€์ž ๊น€,์ด,๋ฐ•์ด ํ™”์ƒํ†ตํ™”์— ์ ‘์†ํ•˜๋ฉด ๊ฐ๊ฐ ํ‚ค A,B,C๋ฅผ ๋ถ€์—ฌ๋ฐ›๋Š”๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ด ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ ํด๋ผ์ด์–ธํŠธ๋ผ๋ฆฌ ๋น„๋””์˜ค ์ŠคํŠธ๋ฆผ์„ ์ฃผ๊ณ ๋ฐ›๋Š”๋‹ค.

ChatService (์„œ๋น„์Šค)

์ฑ„๋„ ๊ด€๋ จ

chattingSidebar()

ํŠน์ • ์„œ๋ฒ„์˜ ์ฑ„๋„ ๋ชฉ๋ก ์กฐํšŒ

  • ์—ฐ๊ฒฐ:ย ChatController.chatting()ย โ†’ DB์—์„œ ์ฑ„๋„ ์ •๋ณด ์กฐํšŒ

selectChannel()

ํŠน์ • ์ฑ„๋„ ์ •๋ณด ์กฐํšŒ (ํƒ€์ž… ํ™•์ธ์šฉ)

  • ์—ฐ๊ฒฐ:ย ChatController.chatting()ย โ†’ ์ฑ„๋„์ด Voice์ธ์ง€ Chat์ธ์ง€ ํŒ๋ณ„

Firebase ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ๊ด€๋ จ

insertChat()

์ฑ„ํŒ… ๋ฉ”์‹œ์ง€๋ฅผ Firebase Firestore์— ์ €์žฅ

  • ์—ฐ๊ฒฐ:ย ChatController.sendMessage()ย โ†’ Firebase "RealMan01" ์ปฌ๋ ‰์…˜์— ์ €์žฅ
  • ์ €์žฅ ๋ฐ์ดํ„ฐ: ๋ฉ”์‹œ์ง€ ๋‚ด์šฉ, ๋‹‰๋„ค์ž„, ์ƒ์„ฑ์‹œ๊ฐ„, ์ฑ„๋„๋ฒˆํ˜ธ, ๊ตฌ๋ถ„์ž

selectChatList()

์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ๋ชฉ๋ก์„ Firebase์—์„œ ์กฐํšŒ

  • ์—ฐ๊ฒฐ:ย ChatController.chatting()ย โ†’ Firebase์—์„œ ํŠน์ • ์ฑ„๋„์˜ ๋ฉ”์‹œ์ง€ ์กฐํšŒ
  • ๊ณผ์ •:
    1. Firebase์—์„œ ์ฑ„๋„๋ณ„ ๋ฉ”์‹œ์ง€ ์กฐํšŒ (์ƒ์„ฑ์ผ ์—ญ์ˆœ)
    2. ์‹œ๊ฐ„ ํฌ๋งท ๋ณ€ํ™˜ (24์‹œ๊ฐ„์ œ/12์‹œ๊ฐ„์ œ)
    3. ChatMessage ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜.

DM(Direct Message) ๊ด€๋ จ

createDM()

DM ์ฑ„ํŒ…๋ฐฉ ์ƒ์„ฑ

insertDM()

DM ๋ฉ”์‹œ์ง€๋ฅผ Firebase์— ์ €์žฅ

  • ๊ณผ์ •: "RealMan01" ์ปฌ๋ ‰์…˜์— DM ์ •๋ณด ์ €์žฅ

selectDmList()

ํŠน์ • ํšŒ์›์˜ DM ๋ชฉ๋ก ์กฐํšŒ

  • ์—ฐ๊ฒฐ: DB์—์„œ DM ๋ชฉ๋ก ์กฐํšŒ

selectDm()

ํŠน์ • DM ์ฑ„ํŒ…์˜ ๋ฉ”์‹œ์ง€ ๋ชฉ๋ก ์กฐํšŒ

  • ๊ณผ์ •: Firebase์—์„œ DM ๋ฉ”์‹œ์ง€ ์กฐํšŒ ๋ฐ ์‹œ๊ฐ„ ํฌ๋งท ๋ณ€ํ™˜

selectDmUseNickname(),ย findDMByMembers()

๋‹‰๋„ค์ž„/๋ฉค๋ฒ„ ์ •๋ณด๋ฅผ ํ†ตํ•œ DM ์กฐํšŒ